<?php
namespace app\api\server;

use \Firebase\JWT\JWT;
use Firebase\JWT\Key;
use think\facade\Config;

class Token
{
    private $tokenKey;

    function __construct()
    {
        $this->tokenKey = (string) Config::get('app.token_Key');
    }

    /**
     * 生成验签
     * @param $uid //用户id
     * @return mixed
     */
    function signToken($uid){
        //JWT标准规定的声明，但不是必须填写的；
        //iss: jwt签发者
        //sub: jwt所面向的用户
        //aud: 接收jwt的一方
        //exp: jwt的过期时间，过期时间必须要大于签发时间
        //nbf: 定义在什么时间之前，某个时间点后才能访问
        //iat: jwt的签发时间
        //jti: jwt的唯一身份标识，主要用来作为一次性token。
        $exp_time = 60 * 120; //过期时间2小时
        $token=array(
            "iss"=>'fleamboy',        //签发者 可以为空
            "aud"=>'',          //面象的用户，可以为空
            "iat"=>time(),      //签发时间
            "nbf"=>time(),      //在什么时候jwt开始生效
            "exp"=> time()+ $exp_time ,  //token 过期时间,60秒
            "data"=>[           //记录的uid的信息
                'uid'=>$uid,
            ]
        );
        //生成了 token

        return JWT::encode($token, $this->tokenKey , "HS256");
    }

    /**
     * 验证token
     * @param $token
     * @return array|int[]
     */
    function checkToken($token): array
    {

        $res['status'] = false;
        try {
            JWT::$leeway    = 60;//当前时间减去60，把时间留点余地
            $decoded        = JWT::decode($token, new Key($this->tokenKey, 'HS256')); //HS256方式，这里要和签发的时候对应
            $arr            = (array)$decoded;
            $res['status']  = 200;
            $res['data']    =(array)$arr['data'];
            return $res;

        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $res['info']    = "签名不正确";
            return $res;
        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $res['info']    = "token失效";
            return $res;
        }catch(\Firebase\JWT\ExpiredException $e) { // token过期
            $res['info']    = "token过期";
            return $res;
        }catch(Exception $e) { //其他错误
            $res['info']    = "未知错误";
            return $res;
        }
    }
}